﻿using System.Linq;
using System.Net;
using System.Text;

namespace BlogsAPI.Sites
{
    using System;
    using System.Text.RegularExpressions;
    using Abstract;
    using System.Diagnostics;

    /// <summary>
    /// Live video from twitter
    /// </summary>
    /// <remarks>https://api.periscope.tv/api/v2/getBroadcastPublic?token=</remarks>
    [BlogServiceAPI(Description = "https://www.periscope.tv/", Link = "https://www.periscope.tv/")]
    public class Periscope : BlogServer
    {
        private static readonly Regex Validation = new Regex(@"^https?://(?:www\.)?(?:periscope|pscp)\.tv/", Regexoptions);
        private static readonly Regex ValidationFull = new Regex(@"^https?://(?:www\.)?(?:periscope|pscp)\.tv/([-_\w]+)(?:\s|/|$)", Regexoptions);

        /// <summary>
        /// Дело в том, что перископ использует пользователей твиттера
        /// </summary>
        Twitter tw = new Twitter();

        [DebuggerStepThrough]
        public Periscope()
        {
        }

        #region interface: BlogServer

        /// <summary>
        /// проверка, является ли передаваемый урл чатью этого сервиса
        /// </summary>
        public override Boolean ValidateLink(String sLink)
        {
            return Validation.Match(sLink).Success;
        }

        /// <summary>
        /// проверка, является ли передаваемый урл частью этого сервиса
        /// </summary>
        /// <remarks>BlogType всегда вернется как User</remarks>
        public override Boolean ValidateLink(String sLink, out String userName, out BlogType bType)
        {
            bType = BlogType.Unknown;
            Match m = ValidationFull.Match(sLink);
            if (m.Success)
            {
                bType = BlogType.User;
                userName = m.Groups[1].ToString();
                if (userName == "w")//была просто ссылка на https://www.periscope.tv/w/aJT7KjEwNDYwMzMwfDU2MDU3MzM3qHvl_sG2B8jLe0j5sR94J-66zPigXtuu9sWhXudLZM0=
                {
                    var periscope = new Periscope();
                    var post = periscope.GetPost(sLink);
                    if (post != null && post.User != null && !String.IsNullOrEmpty(post.User.Username))
                    {
                        userName = post.User.Username;//получили имя пользователя запостившего трансляцию
                    }
                }
            }
            else
            {
                userName = String.Empty;
            }
            return m.Success;
        }

        /// <summary>
        /// http://www.t30p.ru/Periscope.aspx
        /// </summary>
        public override bool HasRating
        {
            get { return true; }
        }

        /// <summary>
        /// Дело в том, что перископ использует пользователей твиттера
        /// </summary>
        /// <param name="userName">ник блогера</param>
        /// <param name="bt">Тип блога - сообщество или блог</param>
        public override String GetBlogLink(string userName, BlogType bt)
        {
            return String.Format("https://periscope.tv/{0}", userName?.ToLower());
        }

        /// <summary>
        /// Получение ссылки на rss-блогера 
        /// По умолчанию, грузим блог и извлекаем ссылку
        /// </summary>
        /// <param name="userName">ник блогера</param>
        /// <param name="btype">Тип блога - сообщество или блог</param>
        /// <returns>Link on RSS feed</returns>
        public override string GetRssLink(string userName, BlogType btype)
        {
            return String.Empty;
        }

        #endregion

        /// <summary>
        /// Получение информации о канале и посте
        /// </summary>
        /// <param name="link">ex.https://www.periscope.tv/w/aJT7KjEwNDYwMzMwfDU2MDU3MzM3qHvl_sG2B8jLe0j5sR94J-66zPigXtuu9sWhXudLZM0=</param>
        /// <returns>объект с данными</returns>
        public PeriscopeVideo GetPost(string link)
        {
            try
            {
                //получение данных по посту
                //https://api.periscope.tv/api/v2/getBroadcastPublic?token=
                if (link.Contains("?"))
                {
                    link = link.Split('?')[0];
                }
                //берем последнюю часть
                var token = link.Split(new [] {"/"}, StringSplitOptions.None).Last();
                using (var client = new WebClient() {Encoding = Encoding.UTF8})
                {
                    var jsonData = client.DownloadString("https://api.periscope.tv/api/v2/getBroadcastPublic?broadcast_id=" + token);
                    //broadcast_id
                    return Mapper.Map<PeriscopeVideo>(jsonData) as PeriscopeVideo;//код будет OK
                }
            }
            catch (WebException webEx)
            {
                var resp = webEx.Response as HttpWebResponse;
                if (resp != null)
                {
                    return new PeriscopeVideo {Status = resp.StatusCode};
                }
                Debug.Write(webEx);
            }
            catch (Exception e1)
            {
                Debug.Write(e1);
            }
            return null;
        }

        /// <summary>
        /// Получение ссылки на картинку аватара
        /// </summary>
        /// <param name="userName">имя канала(!)</param>
        /// <returns></returns>
        public override string ExtractAvatar(string userName, BlogType bt)
        {
            return tw.ExtractAvatar(userName, bt);
        }
    }
}